<?php

/**
 * Formulario para las solicitudes de los precios
 * del producto MyAltarget.
 *
 * @package    AltargetEcommerce
 * @subpackage form
 * @author     Carlo Lopez  <carlo.xavier.lopez 'at' gmail 'dot' com >
 */
class MyaltargetPricingRequestForm extends PricingRequestForm
{
  public function configure()
  {
    parent::setup(); 
    $this->setNombreProd('myaltarget');
    //$this->widgetSchema->setNameFormat('presup[%s]');
    //$this->getWidgetSchema()->setDefault('producto','myaltarget');

    //unset($this['_csrf_token']);
    $this->disableLocalCSRFProtection();

    $q0 = Doctrine_Query::create()
       ->select('r.id, r.limite_superior, r.limite_inferior, s.nombre')
       ->from('Regla r')
       ->leftJoin('r.Servicio s')
       ->where('s.nombre = ?','email')
       //->andWhere('r.cuantif_id = ?',$cuantif[0]->getPrimaryKey());
       ->andWhere('r.cuantif_id = ?','contactos'); 
    $reglas_email_db = $q0->execute();
    $opccontacs_email = $this->getOpcionesNumContact($reglas_email_db); 

    $q1 = Doctrine_Query::create()
       ->select('r.id, r.limite_superior, r.limite_inferior, s.nombre')
       ->from('Regla r')
       ->leftJoin('r.Servicio s')
       ->where('s.nombre = ?','email')
       //->andWhere('r.cuantif_id = ?',$cuantif[0]->getPrimaryKey());
       ->andWhere('r.cuantif_id = ?','cupos');
    $reglas_email_cupo = $q1->execute();
    $opccupos_email = $this->getOpcionesCupos($reglas_email_cupo);
   
    //$opcemail = $this->concatArr($opccontacs_email,$opccupos_email);

    $q2 = Doctrine_Query::create()
       ->select('r.id, r.limite_superior, r.limite_inferior, s.nombre')
       ->from('Regla r')
       ->leftJoin('r.Servicio s')
       ->where('s.nombre = ?','sms')
       //->andWhere('r.cuantif_id = ?',$cuantif[0]->getPrimaryKey());
       ->andWhere('r.cuantif_id = ?','cupos');
    $reglas_sms_cupo = $q2->execute();
    $opcsms = $this->getOpcionesCupos($reglas_sms_cupo); 

    $q3 = Doctrine_Query::create()
       ->select('if.id, f.nombre')
       ->from('Frecuencia f');
    $frecuencias = $q3->execute(); 
    $opcfrec = $this->getOpcionesFrec($frecuencias);
/* 
    $this->setWidgets(array(
      'reglaemail' => new sfWidgetFormChoice(array(
        'choices'  => $opcemail,
        'multiple' => false, 
        'expanded' => true,
      )),
      'reglasms'   => new sfWidgetFormChoice(array(
        'choices'  => $opcsms,
        'multiple' => false,
        'expanded' => true,
      )),
      'frecuencia' => new sfWidgetFormChoice(array(
        'choices'  => $opcfrec,
        'multiple' => false,
        'expanded' => true,
      )),
    ));
*/

    $widgets = array(
      'regla_email_0' => new sfWidgetFormChoice(array(
        'choices'  => $opccontacs_email,
        'multiple' => false, 
        'expanded' => true,
        'label'    => "Emails por tamaño de BD",
      )),
      'regla_email_1' => new sfWidgetFormChoice(array(
        'choices'  => $opccupos_email,
        'multiple' => false, 
        'expanded' => true,
        'label'    => "Emails por cupos",
      )),
      'regla_sms_0'   => new sfWidgetFormChoice(array(
        'choices'  => $opcsms,
        'multiple' => false,
        'expanded' => true,
        'label'    => "SMS por cupos",
      )),
      'frecuencia' => new sfWidgetFormChoice(array(
        'choices'  => $opcfrec,
        'multiple' => false,
        'expanded' => true,
        'label'    => "Frecuencia de Pagos",
      )),
    );

    foreach($widgets as $nombre => $widget)
      $this->widgetSchema[$nombre] = $widget;
/*
    $this->setValidators(array(
      'reglaemail' => new sfValidatorChoice(Array(
        'choices'  => array_values($opcemail))),
      'reglasms'   => new sfValidatorChoice(Array(
        'choices'  => array_values($opcsms))),
      'frecuencia' => new sfValidatorChoice(Array(
        'choices'  => array_values($opcfrec))), 
    ));
*/
    $validators = array(
      'producto'   => new sfValidatorChoice(array('choices' => array('myaltarget')
        , 'empty_value' => 'myaltarget')),
      'regla_email_0' => new sfValidatorChoice(array(
        'choices'  => array_keys($opccontacs_email), 'required' => false )),
      'regla_email_1' => new sfValidatorChoice(array(
        'choices'  => array_keys($opccupos_email), 'required' => false )),
      'regla_sms_0'   => new sfValidatorChoice(array(
        'choices'  => array_keys($opcsms), 'required' => false)),
      'frecuencia' => new sfValidatorChoice(array(
        'choices'  => array_keys($opcfrec))), 
    );
    foreach($validators as $nombre => $validator)
      $this->validatorSchema[$nombre] = $validator;

    $this->validatorSchema->setPostValidator(
      new sfValidatorCallBack(array('callback' => array($this, 'checkSolicitaServicio')))
    );
  }

  protected function getOpcionesNumContact($reglas)
  {
    $result = array();
    foreach($reglas as $regla):
      //$result[$regla->getPrimaryKey()] = $regla->__toString();
      $result[$regla->getPrimaryKey()] = $regla->getLimiteInferior()
        .' a '.$regla->getLimiteSuperior() . ' ' . $regla->getCuantifId();
    endforeach;

    return $result;
  } 

  protected function getOpcionesCupos($reglas)
  {
    $result = array();
    foreach($reglas as $regla):
      $result[$regla->getPrimaryKey()] = $regla->getLimiteSuperior() . ' ' . $regla->getCuantifId();
    endforeach;

    return $result;
  }

  protected function getOpcionesFrec($frecs)
  {
    $result = array();
    foreach($frecs as $frec):
      $result[$frec->getPrimaryKey()] = $frec->getNombre();
    endforeach;

    return $result;
  }

  protected function concatArr($arr1, $arr2)
  {
    $siz1 = sizeof($arr1);
    $siz2 = sizeof($arr2);
    if($siz1 > $siz2)
    {
      $len = $siz2;
      $result = $arr1;
      $aux = $arr2;
    }else {
      $len = $siz1;
      $result = $arr2;
      $aux = $arr1;
    }
    foreach($aux as $key => $value) 
    {
      $result[$key] = $value;
    }

    return $result;
  }

  /*
   * Se verifica que se haya seleccionado algun servicio de este producto.
   */
  public function checkSolicitaServicio($validator, $values)
  {
    //if( !array_key_exists('reglaemail',$values) && !array_key_exists('reglasms',$values) )
    if( !isset($values['regla_email_0']) && 
            !isset($values['regla_email_1']) && !isset($values['regla_sms_0']) )
    {
      throw new sfValidatorError($validator, 'Debe seleccionar algun servicio');

    }
    return $values;
  }

  public function calcCotizacion(sfWebRequest $req)
  {
    /*
    $clon = clone $this;
    $campos = $clon->getWidgetSchema()->getFields();
    foreach($campos as $campo)
      $campo->setHidden(true);
    return $clon;
    */
    $reglas = array();
    foreach($this->widgetSchema->getFields() as $key => $widget)
    {
      $reglas[$key] = $this->getValue($key);//$widget->getDefault();
    }
    return new CotizacionForm($reglas);
  }
}

